﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using RRTWSEntityDSD.Bean;
using RRTWSDSD.ServiceEntidad;
using RRTWSEntityDSD.Dominio;

namespace RRTWSDSD
{
    /// <summary>
    /// Summary description for ComprarEntradasServices
    /// </summary>
    [WebService(Namespace = "http://rtt.edu.upc.com.pe/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class ComprarEntradasServices : System.Web.Services.WebService
    {
        private static ClienteServices clienteService = new ClienteServices();
        private static EventoServices eventoService = new EventoServices();
        private static AsientoService asientoService = new AsientoService();
        private static OperacionEnLineaServices operacionEnLineaService = new OperacionEnLineaServices();
        private static EntradaService entradaService = new EntradaService();
        private static PagoServices pagoService = new PagoServices();
        private static RRTWSEntityDSD.CalcularServiceServiceReference.CalcularServiceSoapClient proxy = new RRTWSEntityDSD.CalcularServiceServiceReference.CalcularServiceSoapClient();

        [WebMethod]
        public CompraEntrada comprarEntradaOnline(string uuid, int evento, int[] asientos, int modo, string entidadBancaria, string numeroTrajeta)
        {

            if ((modo == 1))
            {
                throw new NullReferenceException("No es valido este servicio, solo es para pagar por medio de tarjetas credito o debito.");
            }
            if (asientos == null && asientos.Length == 0)
            {
                throw new NullReferenceException("Lista de asientos es nula o esta vacia");
            }
            if (evento == 0)
            {
                throw new NullReferenceException("Evento Deportivo invalido");
            }
            if ((modo == 0) )
            {
                throw new NullReferenceException("Modo ingresado invalido");
            }
            if ((modo == 2) || (modo == 3))
            {
                if (entidadBancaria == null || entidadBancaria.Equals(""))
                {
                    throw new NullReferenceException("Entidad bancaria no seleccionada");
                }
                if (numeroTrajeta == null || numeroTrajeta.Equals(""))
                {
                    throw new NullReferenceException("Numero de Tarjeta invalido");
                }
            }

            



            try
            {
                Cliente clienteUuID = clienteService.getCliente(uuid);
                DateTime fechaActual = DateTime.Now;
                EventoDeportivo eventoDeportivo = eventoService.getEvento(evento);
                string fin = fechaActual.ToString();
                double diferencia = proxy.calcularDiferenciaFechasHoras( fin,eventoDeportivo.fechaInicio);
                if (diferencia <= 24) // si es menor a uno(un dia o 24 horas) 
                {
                    throw new NullReferenceException("Limite de fecha excedido para comprar Online");
                }

                List<Asiento> listaAsientos = new List<Asiento>();
                Asiento asiento = null;
                foreach (int idasiento in asientos)
                {
                    asiento = asientoService.getAsientoDisponiblePorEvento(idasiento, evento);
                    listaAsientos.Add(asiento);
                }
                double montoTotal = proxy.montoTotal(eventoDeportivo.precioEntrada, listaAsientos.Count);

                /*
                 falta validar el numero de tarjeta con algun servicio(simulado) del banco 
                 * si es exitoso se procede al pago en caso contrario lanza una exception(idea puede ser por REST)
                 */

                OperacionLinea operacionEnLinea = new OperacionLinea();
                operacionEnLinea.idCliente = clienteUuID.idcliente;
                operacionEnLinea.montoTotal = montoTotal;
                operacionEnLinea.fechaOperacion = String.Format("{0:u}", DateTime.Now);               
                operacionEnLinea = operacionEnLineaService.creaNuevaOperacion(operacionEnLinea);

                Pago pago =  pagoService.registrarPago(operacionEnLinea.idOperacion, modo, entidadBancaria, numeroTrajeta);

                foreach (Asiento asient in listaAsientos)
                {
                    entradaService.crearEntrada(asient.idAsiento, evento,eventoDeportivo.precioEntrada , operacionEnLinea.idOperacion, 1);
                }

                CompraEntrada compra = new CompraEntrada();
                compra.operacionEnLinea = operacionEnLinea;
                compra.pago = pago;

                return compra;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }

        }
    }
}
